package com.example;


/**
 * @Author loubobooo
 * @Description #203. 移除链表元素
 * @Date 2022/3/1
 **/
public class RemoveLinkedListElements {

    class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    /**
     * 方法描述:给你一个链表的头节点 head 和一个整数 val ，请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。
     * 示例 1：
     * 输入：head = [1,2,6,3,4,5,6], val = 6
     * 输出：[1,2,3,4,5]
     * @param: [head, val]
     * @return: com.example.RemoveLinkedListElements.ListNode
     * @author: loubobooo
     * @date: 2022/3/1
     */
    public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return head;
        }
        // 添加虚拟头节点
        ListNode result = new ListNode(-1, head);
        // 前指针
        ListNode prev = result;
        // 后指针
        ListNode cur = head;
        while(cur != null){
            if(cur.val == val){
                // 节点next指针直接指向下下一个节点
                prev.next = cur.next;
            }else{
                prev = cur;
            }
            cur = cur.next;
        }
        return result.next;
    }
}
